package main

import "fmt"

func main() {
	employee := Employee{
		name:     "tuanzhang",
		salary:   100000,
		currency: "CNY",
	}

	employee.displaySalary()

	employee1 := Employee1{
		Employee: employee,
	}

	employee1.extendTest()
	fmt.Println(employee1.name)
	employee1.sayHi()
}

type Employee struct {
	name     string
	salary   int
	currency string
}

type Employee1 struct {
	Employee
}

/*
为什么我们可以用函数来写相同的程序呢?有以下几个原因

Go不是一种纯粹面向对象的编程语言，它不支持类。因此，类型的方法是一种
实现类似于类的行为的方法。
相同名称的方法可以在不同的类型上定义，而具有相同名称的函数是不允许的。
假设我们有一个正方形和圆形的结构。可以在正方形和圆形上定义一个名为Area的方法。这是在下面的程序中完成的。

*/

/*就是Employee 的内部方法*/
func (e Employee) displaySalary() {
	fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary)
}

/*就是Employee 的内部方法*/
func (e Employee) extendTest() {
	fmt.Printf("测试继承")
}

/*可以定义相同的方法名, 因为所属的类不一样*/
func (e Employee1) displaySalary() {
	fmt.Printf("Salary of %s is %s%d", e.name, e.currency, e.salary)
}

/*
method 重写
*/
func (e Employee) sayHi() {
	fmt.Printf("Employee say hi \n")
}

/*
method 重写
*/
func (e Employee1) sayHi() {
	fmt.Printf("Employee1 say hi \n")
}
